/**
 * 定义公用模态框的类型信息
 * 方便对模态框弹出等处理
 *
 * 当前还不支持引入类型来defineprops。只是提出来以后备用
 * https://vuejs.org/api/sfc-script-setup.html#typescript-only-features
 *
 * Currently complex types and type imports from other files are not supported.
 * It is possible to support type imports in the future.
 */

import { computed, watch } from 'vue';

/**
 * 显示隐藏对应的props
 * 和类型信息
 */
export interface Visible {
  visible: boolean;
}

/**
 * 相关的emits对应类型
 * 参数等定义
 */
export interface VisibleEmits {
  (e: 'update:visible', visible: boolean): void;
}

/**
 * composable 对应的显示隐藏属性
 * @param props 属性
 * @param emits 事件
 * @returns
 */
export const useVisible = (props: Visible, emits: VisibleEmits) => {
  // 间接托管的可见状态
  const formVisible = computed({
    get: () => props.visible,
    set: (v) => emits('update:visible', v),
  });

  return {
    formVisible,
    /**
     * 当状态变为打开的时候
     * @param callback 回调执行
     * @returns
     */
    open: (callback: () => any) => watch(formVisible, (v) => v && callback()),
    /**
     * 关闭方法
     */
    close: () => {
      formVisible.value = false;
    },
  };
};
